package com.gudong.generator.util;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.gudong.generator.config.AutoCodeGeneratorProperties;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class AutoCodeGenerator {

    @Resource
    private AutoCodeGeneratorProperties autoCodeGeneratorProperties;
    @Value("${spring.application.name}")
    private String applicationName;

    /**
     * MyBatis-Plus 代码生成器「新」
     * 适用版本：mybatis-plus-generator 3.5.1 及其以上版本，对历史版本不兼容
     * 执行 run
     */
    public void generator() throws Exception {
        // 项目路径
        String projectPath = System.getProperty("user.dir") + "/services/" + applicationName + "/src/main/java";
        String projectPathXml = System.getProperty("user.dir") + "/services/" + applicationName + "/src/main/resources";
        // 根据数据源信息，创建文件，生成代码
        FastAutoGenerator.create(new DataSourceConfig.Builder(autoCodeGeneratorProperties.getUrl(),
                        autoCodeGeneratorProperties.getUsername(), autoCodeGeneratorProperties.getPassword()))
                // 全局配置
                //全局配置
                .globalConfig((scanner, builder) -> {
                    //配置作者
                    builder.author("hl")
                            //配置时间
                            .commentDate("yyyy-MM-dd")
                            //输出目录
                            .outputDir(projectPath);
                })
                // 包配置
                //包配置
                .packageConfig((scanner, builder) -> {
                    //配置父包名
                    builder.parent(autoCodeGeneratorProperties.getParentUrl())
                            // 设置Mapper XML文件的输出路径
                            .pathInfo(Map.of(OutputFile.xml, projectPathXml + "/mapper"));
                    ;
                })
                // 模版配置
                .templateConfig(builder -> builder
                        .disable(TemplateType.CONTROLLER, TemplateType.SERVICE, TemplateType.MAPPER, TemplateType.XML)
                        .service("/templates/service.java")
                        .serviceImpl("/templates/serviceImpl.java")
                        .mapper("/templates/mapper.java")
                        .controller("/templates/controller.java")
                        .xml("/templates/mapper.xml"))
                // 策略配置
                .strategyConfig(builder -> builder
                        // 指定表名，用逗号分隔
                        .addTablePrefix(autoCodeGeneratorProperties.getTablePrefix())
                        // 先开启 Controller 配置
                        .controllerBuilder()
                        // 开启生成 @RestController 控制器
                        .enableRestStyle()
                        // 开启驼峰转连字符
                        .enableHyphenStyle()
                        // 先开启 Entity 配置
                        .entityBuilder()
                        // 开启主键自增
                        .idType(IdType.AUTO)
                        // 数据库表映射到实体的命名策略，驼峰命名
                        .naming(NamingStrategy.underline_to_camel)
                        // 数据库表字段映射到实体的命名策略，驼峰命名
                        .columnNaming(NamingStrategy.underline_to_camel)
                        // 开启生成实体时生成字段注解
                        .enableTableFieldAnnotation()) // 开启 Mapper 配置


                // 自定义配置：用来生产前端部分的 Vue 页面

                // freemarker 模版
                .templateConfig((scanner, builder) -> {
                    //配置不需要生成的文件
//                  builder.disable(TemplateType.CONTROLLER,TemplateType.SERVICE,TemplateType.SERVICE_IMPL);
                })
                // 执行
                .execute();
    }
}